import xml.etree.ElementTree as ET
from shapely.geometry import Polygon, MultiPolygon

def load_shapes(svg_file):
    """
    加载 SVG 文件中的形状，将其转换为适合排版的数据格式。
    
    参数:
        svg_file (str): SVG 文件路径。
    
    返回:
        list: 形状的多边形列表 (Shapely Polygon 或 MultiPolygon 对象)。
    """
    shapes = []

    try:
        # 解析 SVG 文件
        tree = ET.parse(svg_file)
        root = tree.getroot()

        # SVG 的命名空间
        ns = {"svg": "http://www.w3.org/2000/svg"}

        # 查找所有路径元素
        for path_elem in root.findall(".//svg:path", ns):
            d_attr = path_elem.get("d")
            if d_attr:
                polygon = parse_svg_path_to_polygon(d_attr)
                if polygon:
                    shapes.append(polygon)

        # 处理多边形元素（<polygon> 或 <polyline>）
        for poly_elem in root.findall(".//svg:polygon", ns):
            points = poly_elem.get("points")
            if points:
                polygon = parse_svg_points_to_polygon(points)
                if polygon:
                    shapes.append(polygon)

    except Exception as e:
        print(f"Error loading SVG shapes: {e}")

    return shapes

def parse_svg_path_to_polygon(d_attr):
    """
    将 SVG 路径数据 ("d" 属性) 转换为 Shapely Polygon。

    参数:
        d_attr (str): SVG 路径的 "d" 属性值。
    
    返回:
        Polygon 或 None: 转换成功的多边形，或 None。
    """
    try:
        # 使用外部库 svg.path 将路径解析为点
        from svg.path import parse_path

        path = parse_path(d_attr)
        points = [(segment.start.real, segment.start.imag) for segment in path]
        if len(points) > 2:  # 必须至少有 3 个点形成闭合多边形
            return Polygon(points)
    except Exception as e:
        print(f"Error parsing SVG path: {e}")
    return None

def parse_svg_points_to_polygon(points_str):
    """
    将 SVG 多边形或折线的 "points" 属性转换为 Shapely Polygon。

    参数:
        points_str (str): SVG 的 "points" 属性值。
    
    返回:
        Polygon 或 None: 转换成功的多边形，或 None。
    """
    try:
        points = []
        for pair in points_str.strip().split():
            x, y = map(float, pair.split(","))
            points.append((x, y))
        if len(points) > 2:  # 必须至少有 3 个点形成闭合多边形
            return Polygon(points)
    except Exception as e:
        print(f"Error parsing SVG points: {e}")
    return None
